package Pre.Set;

import java.util.HashMap;
import java.util.function.BiFunction;
import java.util.function.Function;

public class Demo1 {

    public static void main(String[] args) {
        HashMap<Integer, TVPlay> hashMap = new HashMap<>();
        hashMap.put(1, new TVPlay("甄嬛传", 74));
        hashMap.put(2, new TVPlay("长风渡", 40));
        hashMap.put(3, new TVPlay("莲花楼", 40));
        hashMap.put(4, new TVPlay("长相思", 40));
        hashMap.put(5, new TVPlay("长相思", 40));
        System.out.println(hashMap.containsKey(5)); // true


        // compute 无论key是否存在 都会进入apply方法
        // key 存在 apply方法返回的是null key就会被删除 方法返回非null值，会把返回值和key映射起来 hashMap.put(key, hj)
        // key 不存在 apply方法返回的是非null值 会把返回值和key映射起来添加到HashMap中
        // hashMap.put(key, value)

        TVPlay compute = hashMap.compute(8, new BiFunction<Integer, TVPlay, TVPlay>() {
            @Override
            public TVPlay apply(Integer key, TVPlay value) {
                System.out.println("key" + key);
                System.out.println("value" + value);
                TVPlay hj = new TVPlay("回家的诱惑", 80);
                return hj;
            }
        });
        System.out.println(compute);
        System.out.println(hashMap.containsKey(8));
        System.out.println(hashMap.get(8));
        System.out.println(hashMap);


        // key 不存在 或者映射的是null  containsKey 返回true get(key) null
        // apply方法返回的是非null值 会把返回值和key映射起来添加到HashMap中
        TVPlay t = hashMap.computeIfAbsent(7, new Function<Integer, TVPlay>() {
            @Override
            public TVPlay apply(Integer key) {
                System.out.println(key);
                return new TVPlay("长月烬明",48);
//                return null;
            }
        });
        System.out.println(t);//TVPlay{name='长月烬明', series=48}
        System.out.println(hashMap.containsKey(7));// true
        System.out.println(hashMap.get(7));// TVPlay{name='长月烬明', series=48}
//        System.out.println(t); // null
//        System.out.println(hashMap.containsKey(7)); // false
//        System.out.println(hashMap.get(7)); // null


        // 当key存在 containsKey true  get(key) != null
        // 当apply方法返回null值，删除key的映射 remove(key)
        // 当apply方法返回非null值，把返回值和key映射起来  put(key, 返回值);

        TVPlay t1 = hashMap.computeIfPresent(6, new BiFunction<Integer, TVPlay, TVPlay>() {
            @Override
            public TVPlay apply(Integer integer, TVPlay tvPlay) {
                System.out.println(integer);
                System.out.println(tvPlay);
                return new TVPlay("仙剑奇侠传", 37);
            }
        });
        System.out.println(t1); // 仙剑
        System.out.println(hashMap.containsKey(6)); // true
        System.out.println(hashMap.get(6)); // 仙剑
        System.out.println(hashMap);

        // 如果key没有映射的值或者为null，那么就把 key和value映射起来添加到hashMap中 并返回value
        // 如果key有映射，apply方法返回null删除掉key remove(key)
        // apply方法返回非null，将key和返回值映射  put(key, 返回值)

        TVPlay t2 = hashMap.merge(9, new TVPlay("庆余年", 56), new BiFunction<TVPlay, TVPlay, TVPlay>() {
            @Override
            public TVPlay apply(TVPlay tvPlay, TVPlay tvPlay2) {
                System.out.println(tvPlay); // 仙剑
                System.out.println(tvPlay2); // 庆余年
                return tvPlay2;
            }
        });
        System.out.println(t2); // 庆余年
        System.out.println(hashMap.containsKey(9));
        System.out.println(hashMap.get(9));
    }
}